package application;

import controleur.ConnexionBD;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

public class CritiqueDAO
{
    /**
     * Transforme un ResultSet en liste de CritiqueBean
     * @param set
     * @return 
     */
    private static List<CritiqueBean> getCritiques(final ResultSet set)
    {
        List<CritiqueBean> critiquesBeanListe = new ArrayList<CritiqueBean>();

        try {
            if (set != null) {
                while (set.next()) {
                    Critique c = new Critique();

                    c.setCote(set.getString("cote"));
                    c.setCritique(set.getString("critique"));
                    c.setIdCritique(set.getString("id_critique"));
                    c.setIdMembre(set.getString("id_membre"));
                    c.setIsbn(set.getString("isbn"));

                    critiquesBeanListe.add(c.getCritiqueBean());
                }
            }
        } catch (Exception e) {
        }
        return critiquesBeanListe;
    }

    /**
     * Transforme un ResultSet en String
     * @param set
     * @return 
     */
    private static String getCoteMoyenne(final ResultSet set)
    {
        String coteMoyenne = "";

        try {
            if (set != null) {
                if (set.first()) {
                    coteMoyenne = set.getString("cote_moyenne");

                    if (coteMoyenne == null) {
                        coteMoyenne = "Aucune cote";
                    } else {
                        Double coteMoyenneDouble = Math.round(Double.parseDouble(coteMoyenne) * 10.0) / 10.0;

                        if (coteMoyenneDouble == 10) {
                            coteMoyenne = "10/10";
                        } else {
                            coteMoyenne = String.valueOf(coteMoyenneDouble) + "/10";
                        }
                    }
                }
            }
        } catch (Exception e) {
        }
        return coteMoyenne;
    }

    /**
     * Retourne la moyenne des cotes d'un isbn.
     * @param isbn
     * @return 
     */
    public static String getCoteMoyenne(final String isbn)
    {
        final String query = "select AVG(cote) cote_moyenne from critique where isbn=?";
        String cote;

        ConnexionBD con = new ConnexionBD();
        cote = CritiqueDAO.getCoteMoyenne(con.execute_query(query, isbn));
        con.close();

        return cote;
    }

    /**
     * Retourne la liste des critiques d'un isbn.
     * @param isbn
     * @return 
     */
    public static List<CritiqueBean> getCritiquesLivre(final String isbn)
    {
        final String query = "select * from critique where isbn=? order by id_critique desc";
        List<CritiqueBean> cbean;

        ConnexionBD con = new ConnexionBD();
        cbean = CritiqueDAO.getCritiques(con.execute_query(query, isbn));
        con.close();

        return cbean;
    }

    /**
     * Retourne la liste des critiques d'un isbn appartenant 
     * à un membre.
     * @param isbn
     * @param idMembre
     * @return 
     */
    public static List<CritiqueBean> getCritiqueMembre(final String isbn, final String idMembre)
    {
        final String query = "select * from critique where isbn=? and id_membre=?";
        List<CritiqueBean> cbean;

        ConnexionBD con = new ConnexionBD();
        cbean = CritiqueDAO.getCritiques(con.execute_query(query, isbn, idMembre));
        con.close();

        return cbean;
    }

    /**
     * Écrit une critique
     * @param c
     * @return 
     */
    public static int ecrireCritique(final CritiqueBean c)
    {
        final String query = "INSERT INTO critique (isbn, id_membre, critique, cote) VALUES (?, ?, ?, ?)";
        int r;

        ConnexionBD con = new ConnexionBD();
        r = con.execute_update(query, c.getIsbn(), c.getIdMembre(),
                c.getCritique(), c.getCote());
        con.close();

        return r;
    }

    /**
     * Supprime une critique avec son Id.
     * @param idCritique
     * @return 
     */
    public static int supprimerCritique(final String idCritique)
    {
        final String query = "DELETE FROM critique WHERE id_critique=?";
        int r;

        ConnexionBD con = new ConnexionBD();
        r = con.execute_update(query, idCritique);
        con.close();

        return r;
    }
}
